#define DH_SENSER 0     // 启用温湿度传感器 1:启用 0:停用
#define PIR_SENSER 0    // 启用人体热释电传感器 1:启用 0:停用
#define SWITCH_SENSER 1 // 启用继电器 1:启用 0:停用

#include <Arduino.h>
#include <ESP32Ping.h>

// 自定义模块
#include "OledModule/Oled.h"
#include "WifiModule/MyWifi.h"
#include "MqttModule/MyMqtt.h"
#include "Eye/eye.h"
#include "FileSys/FileSys.h"
// 传感器模块
#include "Senser/TH.h"
#include "Senser/Pir.h"
#include "Senser/SenserConfig.h"
#include "Senser/Switch.h"

String deviceName = "";
String mqttUser = "";
String mqttPassword = "";
String mqttServer = "";
String mqttPort = "";
const char *ssid_c = "";
const char *password_c = "";

boolean isApMode = false; // 当前是否是ap模式

void setup()
{
    if (DH_SENSER == 1)
    {                // 温湿度传感器
        dht.begin(); // 初始化DHT传感器
    }
    if (PIR_SENSER == 1)
    { // 人体热释电传感器
        // 初始化PIR传感器引脚为输入
        pinMode(pirSenserPin, INPUT);
    }
    if (SWITCH_SENSER == 1)
    { // 初始化继电器
        initSwitch();
    }

    Serial.begin(115200);

    initSPIFFS();

    getUseAbleSpace();

    preferences.begin("wifi-config", false); // 打开NVS

    // 尝试读取存储的SSID和密码
    String ssid = preferences.getString("ssid", "");
    ssid_c = ssid.c_str();
    String password = preferences.getString("password", "");
    password_c = password.c_str();

    mqttServer = preferences.getString("mqtt_server", "");     // 192.168.10.2
    mqttUser = preferences.getString("mqtt_user", "");         // esp32
    mqttPassword = preferences.getString("mqtt_password", ""); // 123456
    mqttPort = preferences.getString("mqtt_port", "");         // 1883

    // 把设备名称读取出来放内存中
    deviceName = preferences.getString("deviceName", "未设置");

    // 关闭 Preferences
    // preferences.end();

    // 初始化显示屏
    initOLed();
    initEye();
    // 显示开机卡通眼睛
    showCartoonEyes();
    delay(2000);
    // 显示正在连接动画
    showWifiLink();

    // 连接wifi
    if (!setupWifi(ssid_c, password_c))
    {
        Serial.println("Failed to connect to WiFi. Starting AP mode...");
        isApMode = true;
        setupAP();
    }
    else
    {
        Serial.println("Connected to WiFi");
        // 设置mqtt参数
        setupMqtt(mqttServer.c_str(), mqttPort.toInt(), mqttUser.c_str(), mqttPassword.c_str());
        connect_mqtt(mqttUser.c_str(), mqttPassword.c_str());
    }

    initCpuSensor();
}

void loop()
{
    if (WiFi.status() != WL_CONNECTED)
    {
        setupWifi(ssid_c, password_c);
    }
    else
    { // WIFI 连接成功
        // 判断网络是否正常，尝试ping百度服务器，防止wifi连接正常，网络异常的情况重置配置
        if (Ping.ping("www.baidu.com", 3))
        {
            Serial.println("Network is connected");
            if (!mqClient.connected())
            { // 设置mqtt参数
                setupMqtt(mqttServer.c_str(), mqttPort.toInt(), mqttUser.c_str(), mqttPassword.c_str());
                connect_mqtt(mqttUser.c_str(), mqttPassword.c_str());
            }
            else
            { // mq和wifi都正常，循环执行
                // 改为显示动态眼睛
                drawRadomEye();

                if (DH_SENSER == 1)
                { // 温湿度传感器
                    send_discovery_messages();
                    getTemperature();
                }
                if (SWITCH_SENSER == 1)
                { // 继电器
                    send_switch_discovery_message();
                }
                if (PIR_SENSER == 1)
                { // 人体热释电传感器
                    reflushPirSenser();
                }
                // 发送心跳包
                sendHeartBeat();
            }
            mqClient.loop();
        }
        else
        {
            Serial.println("Network is disconnected");
        }
    }

    // 确保 Web 服务器和 DNS 服务器正常运行
    if (isApMode)
    {
        Serial.println("Keep web server And Dns Server!");
        dnsServer.processNextRequest();
        server.handleClient();
    }
}
